package ThreadAndLambda.等待唤醒机制;

/*
    生产者（商店）：是一个线程类，可以继承Thread
    设置线程任务（run）：生产商品
    对商品的状态进行判断
    true：商品存在
        商店调用wait方法进入等待状态
    false：商品不存在
        商店生产商品（交替生产两种物品）
        i%2==0/1 来交替生产物品
        生产完成后，修改商品状态为true
        唤醒消费者线程，让其购买商品

     注意：
        商店和商品线程关系--->通信（互斥）
        必须使用同步技术保证两个线程只有一个在执行
        锁对象必须保证唯一，可以使用商品对象作为锁对象
        商品和商店的类就需要把商品对象作为参数传递进来
            1、需要在成员位置创建一个商品变量
            2、使用带参数的构造方法，为这个商品变量赋值
*/
public class shop extends Thread {
    // 1、需要在成员位置创建一个商品变量
    private Item item;

    // 2、使用带参数的构造方法，为这个商品变量赋值
    public shop(Item item) {
        this.item = item;
    }

    //设置线程任务（run）：生产商品
    @Override
    public void run() {
        //商品变量，用于判断生产不同的商品
        int count = 0;
        //让商店一直生产物品
        while (true) {
            synchronized (item) {
                //对商品的状态进行判断
                if (item.flag == true) {
                    try {
                        //商店调用wait方法进入等待状态
                        item.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //被唤醒之后，商店生产商品，交替生产两种物品
                if (count % 2 == 0) {
                    //生产a商品
                    item.name = "水杯";
                    item.price = 20;

                } else {
                    //生产b商品
                    item.name = "雨伞";
                    item.price = 15;
                }
                //每次生产不同的商品
                count++;
                System.out.println("商店正在生产" + item.name + "价格为" + item.price);
                //生产商品需要2秒
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                item.flag = true;
                item.notify();
                System.out.println("商品已经生产完成，" + item.name + "价格为" + item.price);
            }
        }
    }
}
